package top.humbleyuan.util;

import java.util.Arrays;

/**
 * @Author HumbleYuan
 * @Date 2020/3/29 11:03
 * @Des 随机数
 */
public class Random {
    public static void main(String[] args) {
        int[] res = getDifRandom(20, 1, 20);
        System.out.println(Arrays.toString(res));
    }

    /**
     * 获取范围内固定数量不同随机数
     * min,max包含
     * @param count
     * @param min
     * @param max
     * @return
     */
    public static int[] getDifRandom(int count, int min, int max) {

        /**
         * 生成指定范围内的不重复的随机数：
         * 1. 用数组ranList存储所有可能的随机数
         * 2. 每次随机出ranList的序号index
         * 3. 每次产生一位随机数后，将ranList缩小，将ranList刚随机出的一个数和数组中最后一个未使用过的一位数交换
         *      即保证前k数还没有被随机过
         */

        int ranScope = max - min + 1;

        int[] ranList = new int[ranScope];
        int[] res = new int[count];

        // 生成随机数组
        for (int i = min; i <= max; i++) {
            ranList[i - min] = i;
        }

        int k = max - min + 1;
        for (int i = 0; i < count; i++) {
            int ran = (int)(Math.random() * k);     // 0 ~ (max-min)
            res[i] = ranList[ran];

            // 去重，缩小随机数区间(如果ran == --k也无所谓，反正是缩小范围)
            ranList[ran] = ranList[--k];
        }

        return res;

    }
}
